/*	Nama file		: Date.c
	Deskripsi		: Body type dan prototype primitif type date
	Nama pembuat	: Muhammad Ghufron Mahfudhi (23512066), Ni Made Satvika Iswari(23512077)
	Hari / Tanggal	: Sabtu, 22 September 2012
*/

#include "Date.h"

/* Validasi Terhadap Type */
int IsDateValid (int D, int M, int Y){
/*	Mengirim 1 jika D, M, Y dapat membentuk tanggal yang valid */
/*	dipakai untuk mengetes sebelum membentuk sebuah tanggal */
	/* ALGORITMA */
	return ((D >= 1) && (M >= 1) && (M <=12) && (Y >= 0) && (((M == 1) || (M == 3) || (M == 5) || (M == 7) || (M == 8) || (M == 10) || (M == 12))? (D <= 31) : (((M == 4) || (M == 6) || (M == 9) || (M == 11))? (D <= 30) : ((M == 2)? ((IsKabisat (Y))? (D <= 29) : (D <= 28)) : 0))));
}

/* Konstruktor */
Date MakeDate (int d, int m, int y){
/*	Membentuk tanggal dari tanggal d, bulan m, dan tahun y */
/*	Prekondisi : d, m, y dapat membentuk tanggal yang valid */
	/* KAMUS LOKAL */
	Date D;
	/* ALGORITMA */
	SetDay(&D, d);
	SetMonth(&D, m);
	SetYear(&D, y);
	return D;
}

Date MakeDatefromStr(char date[], char month[], char year[])
/* 	Membentuk tanggal dari string date, month, year */
{
	/* Kamus Lokal */
	Date D;
	char delims[] = "/";
	char *d;
	int dd, mm, yy;
	char tmp[100];
	
	/* Algoritma */
	dd = atoi(date);
	mm = atoi(month);
	yy = atoi(year);
	
	D = MakeDate(dd, mm, yy);
	return D;
}

/* Operator Baca/Tulis */
void BacaTanggal (Date *D){
/*	I.S. Sembarang */
/*	F.S. T terdefinisi dan merupakan tanggal yang valid */
/*	Proses : Mengulangi membaca komponen DD, MM, YY sehingga membentuk T yang valid */
	/* KAMUS LOKAL */
	int d, m, y;
	/* ALGORITMA */
	do{
		printf ("    Masukkan DD : "); scanf ("%d", &d);
		printf ("    Masukkan MM : "); scanf ("%d", &m);
		printf ("    Masukkan YY : "); scanf ("%d", &y);
	} while (! (IsDateValid (d, m, y)));
	*D = MakeDate(d, m, y);
}

void TulisTanggal (Date D){
/*	I.S. T terdefinisi */
/*	F.S. NIlai T ditulis ke layar dengan format DD/MM/YY */
/*	Proses : Menulis nilai setiap komponen T ke layar */
	/* ALGORITMA */
	printf("%s", DateToString(D));
}
	
/* Predikat */
int IsEqD (Date D1, Date D2){
/*	Menghasilkan 1 jika D1 = D2 */
	/* ALGORITMA */
	return ((GetDay(D1) == GetDay(D2)) && (GetMonth(D1) == GetMonth(D2)) && (GetYear(D1) == GetYear(D2)));
}

int IsBefore (Date D1, Date D2){
/*	Menghasilkan 1 jika D1 adalah tanggal sebelum D2 */
	/* ALGORITMA */
	return (GetYear(D1) == GetYear(D2)) ? ((GetMonth(D1) == GetMonth(D2)) ? (GetDay(D1) < GetDay(D2)) : (GetMonth(D1) < GetMonth(D2))) : (GetYear(D1) < GetYear(D2));
}

int IsAfter (Date D1, Date D2){
/*	Menghasilkan 1 jika D1 adalah tanggal sesudah D2 */
	/* ALGORITMA */
	return (GetYear(D1) == GetYear(D2)) ? ((GetMonth(D1) == GetMonth(D2)) ? (GetDay(D1) > GetDay(D2)) : (GetMonth(D1) > GetMonth(D2))) : (GetYear(D1) > GetYear(D2));
}

int IsKabisat (int Y){
/*	Menghasilkan 1 jika tahun Y adalah tahun kabisat yaitu habis dibagi 4 tetapi tidak habis dibagi 100, atau habis dibagi 400 */
	/* ALGORITMA */
	return ((((Y % 4) == 0) && ((Y % 100) != 0)) || ((Y % 400) == 0));
}
	
char* DateToString(Date D)
/* 	Mengembalikan Tanggal dalam format dd/mm/yyyy */
{
	/* Kamus Lokal */
	char* tmp;
	char* str;
	
	/* Algoritma */
	tmp = (char*) malloc (MAX_CHAR * sizeof(char));
	str = (char*) malloc (MAX_CHAR * sizeof(char));
	
	itoa(GetDay(D), str, 10);
	strcpy(tmp, str);
	strcat(tmp, "/");
	itoa(GetMonth(D), str, 10);
	strcat(tmp, str);
	strcat(tmp, "/");
	itoa(GetYear(D), str, 10);
	strcat(tmp, str);
	
	return tmp;
}

